package com.novanok.micurso.entidad;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.renderscript.Sampler;
import android.support.v4.app.NotificationCompat;
import com.firebase.client.ChildEventListener;
import com.firebase.client.DataSnapshot;
import com.firebase.client.Firebase;
import com.firebase.client.FirebaseError;
import com.firebase.client.ValueEventListener;
import com.novanok.micurso.AlumnoNotificacionActivity;
import com.novanok.micurso.CursosAlumnoActivity;
import com.novanok.micurso.CursosProfesorActivity;
import com.novanok.micurso.ProfesorNotificacionActivity;
import com.novanok.micurso.R;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Map;

public class Curso implements Serializable {
    private String id;
    private String curso_id;
    private String nombre;
    private String aula;
    private String catedra;
    private String horario;

    private ArrayList<Alumno> alumnosInscriptos;
    private ArrayList<Notificacion> notificaciones;
    private Firebase rootRef;
    private Activity activity;
    private long cantidad;
    private long conteo;
    private boolean muestraNotificaciones = false;
    private ValueEventListener v;

    private NotificationCompat.Builder mNotifyBuilder;
    private final int NOTIFICATION_ID = 4577;

    public Curso(){
        this.id = "";
        this.nombre = "";
        this.alumnosInscriptos = new ArrayList<Alumno>();
        this.notificaciones = new ArrayList<Notificacion>();
    }

    public Curso(String nombre){
        this.id = "";
        this.nombre = nombre;
        this.alumnosInscriptos = new ArrayList<Alumno>();
        this.notificaciones = new ArrayList<Notificacion>();
    }

    public Curso(String id, String nombre){
        this.id = id;
        this.nombre = nombre;
        this.alumnosInscriptos = new ArrayList<Alumno>();
        this.notificaciones = new ArrayList<Notificacion>();
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getCurso_id() {
        return curso_id;
    }

    public void setCurso_id(String curso_id) {
        this.curso_id = curso_id;
    }

    public ArrayList<Alumno> getAlumnosInscriptos() {
        return this.alumnosInscriptos;
    }

    public int getCantidadInscriptos(){
        return this.getAlumnosInscriptos().size();
    }

    public void profesorEscucharInscripciones(){
        this.rootRef = new Firebase("https://mi-curso.firebaseio.com/cursos/" + this.getCurso_id() + "/inscripciones");
        this.rootRef.addChildEventListener(new ChildEventListener() {

            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                Map<String, String> inscriptos = (Map<String, String>)dataSnapshot.getValue();

                Alumno a = new Alumno();
                a.setId( dataSnapshot.getKey() );
                a.setNombre( inscriptos.get("nombre") );
                a.setLegajo( inscriptos.get("legajo") );
                Curso.this.getAlumnosInscriptos().add(a);

                if ( Curso.this.activity != null ){
                    ( ( CursosProfesorActivity )Curso.this.activity ).cargarMisCursos();
                }
            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {

            }
        });
    }

    public void escucharNotificaciones(){
        this.muestraNotificaciones = false;
        final Firebase notificacionesCantidad = new Firebase("https://mi-curso.firebaseio.com/cursos/" + this.getCurso_id() + "/notificaciones");
        this.v = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                Curso.this.cantidad = dataSnapshot.getChildrenCount();
                notificacionesCantidad.removeEventListener(Curso.this.v);

                Firebase notificaciones = new Firebase("https://mi-curso.firebaseio.com/cursos/" + Curso.this.getCurso_id() + "/notificaciones");
                notificaciones.addChildEventListener(new ChildEventListener() {
                    @Override
                    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                        Curso.this.conteo++;
                        Map<String, String> noti = (Map<String, String>) dataSnapshot.getValue();

                        Notificacion n = new Notificacion();
                        n.setId(dataSnapshot.getKey());
                        n.setDescripcion(noti.get("descripcion"));
                        n.setFecha(noti.get("fecha"));

                        Curso.this.getNotificaciones().add(n);

                        if (Curso.this.activity != null && Curso.this.activity instanceof ProfesorNotificacionActivity) {
                            ((ProfesorNotificacionActivity) Curso.this.activity).actualizarNotificaciones();
                        }

                        if (Curso.this.activity != null && ( Curso.this.activity instanceof AlumnoNotificacionActivity || Curso.this.activity instanceof CursosAlumnoActivity)) {
                            if (Curso.this.activity instanceof AlumnoNotificacionActivity) {
                                ((AlumnoNotificacionActivity) Curso.this.activity).actualizarNotificaciones();
                            }

                            if ( Curso.this.muestraNotificaciones ) {
                                NotificationManager nNotificationManager = ( NotificationManager )Curso.this.activity.getSystemService( Context.NOTIFICATION_SERVICE );
                                mNotifyBuilder = new NotificationCompat.Builder(Curso.this.activity)
                                        .setContentTitle(Curso.this.activity.getResources().getString(R.string.app_name))
                                        .setLargeIcon(BitmapFactory.decodeResource(Curso.this.activity.getResources(), R.drawable.ic_launcher))
                                        .setSmallIcon(R.drawable.ic_launcher);

                                NotificationCompat.BigTextStyle inboxStyle = new NotificationCompat.BigTextStyle();
                                inboxStyle.setBigContentTitle(Curso.this.activity.getResources().getString(R.string.clase) + Curso.this.getNombre());
                                inboxStyle.setSummaryText(Curso.this.activity.getResources().getString(R.string.notification));
                                inboxStyle.bigText(n.getDescripcion());

                                mNotifyBuilder.setStyle(inboxStyle);

                                Intent notificationIntent = new Intent(Curso.this.activity, Curso.this.activity.getClass());
                                notificationIntent.setAction( Intent.ACTION_MAIN );
                                notificationIntent.addCategory( Intent.CATEGORY_LAUNCHER );

                                PendingIntent contentIntent = PendingIntent.getActivity(Curso.this.activity, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);
                                mNotifyBuilder.setContentIntent(contentIntent);

                                mNotifyBuilder.setDefaults(Notification.DEFAULT_SOUND);

                                nNotificationManager.notify( NOTIFICATION_ID, mNotifyBuilder.build() );
                            }
                        }

                        if (Curso.this.cantidad <= Curso.this.conteo){
                            Curso.this.muestraNotificaciones = true;
                        }
                    }

                    @Override
                    public void onChildChanged(DataSnapshot dataSnapshot, String s) {

                    }

                    @Override
                    public void onChildRemoved( DataSnapshot dataSnapshot ) {
                        Notificacion notificacionAEliminar = null;
                        for ( Notificacion n : Curso.this.getNotificaciones() ){
                            if ( n.getId().compareTo( dataSnapshot.getKey() ) == 0 ){
                                notificacionAEliminar = n;
                                break;
                            }
                        }

                        if (  notificacionAEliminar != null) {
                            Curso.this.getNotificaciones().remove( notificacionAEliminar );

                            if ( Curso.this.activity != null && Curso.this.activity instanceof ProfesorNotificacionActivity) {
                                (( ProfesorNotificacionActivity ) Curso.this.activity ).actualizarNotificaciones();
                            }

                            if ( Curso.this.activity != null && Curso.this.activity instanceof AlumnoNotificacionActivity ) {
                                ( ( AlumnoNotificacionActivity ) Curso.this.activity ).actualizarNotificaciones();
                            }
                        }
                    }

                    @Override
                    public void onChildMoved(DataSnapshot dataSnapshot, String s) {

                    }

                    @Override
                    public void onCancelled(FirebaseError firebaseError) {

                    }
                });
            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {

            }
        };

        notificacionesCantidad.addValueEventListener(this.v);
    }

    public String toString(){
        return this.getId() + " - " + this.getCurso_id() + " - " + this.getNombre();
    }

    public void setActivity(Activity activity) {
        this.activity = activity;
    }

    public ArrayList<Notificacion> getNotificaciones() {
        return this.notificaciones;
    }

    public String getAula() {
        return aula;
    }

    public void setAula(String aula) {
        this.aula = aula;
    }

    public String getCatedra() {
        return catedra;
    }

    public void setCatedra(String catedra) {
        this.catedra = catedra;
    }

    public String getHorario() {
        return horario;
    }

    public void setHorario(String horario) {
        this.horario = horario;
    }
}
